package myzzyl.exception;


import cn.hutool.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j;
import myzzyl.constants.ResponseCode;
import myzzyl.response.BaseResponse;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.HandlerMethodValidationException;

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 处理自定义异常BusinessException。
     * 返回自定义异常中的错误代码和错误消息。
     *
     * @param exception 自定义异常
     * @return 响应数据，包含错误代码和错误消息
     */
    @ExceptionHandler(BusinessException.class)
    public BaseResponse<Object> handleBusinessException(BusinessException exception) {
        exception.printStackTrace();
        if (ObjectUtil.isNotEmpty(exception.getErrorConstants())) {
            log.error("自定义异常处理:{}", exception.getErrorConstants().getMessage());
        }

        return BaseResponse.error(exception.getErrorConstants().getCode(), exception.getErrorConstants().getMessage());

    }

    /**
     * 处理其他未知异常。
     * 返回HTTP响应状态码500，包含错误代码和异常堆栈信息。
     *
     * @param exception 未知异常
     * @return 响应数据，包含错误代码和异常堆栈信息
     */
    @ExceptionHandler(Exception.class)
    public BaseResponse<Object> handleUnknownException(Exception exception) {
        exception.printStackTrace();
        if (ObjectUtil.isNotEmpty(exception.getCause())) {
            log.error("其他未知异常:{}", exception.getMessage());
        }
        return BaseResponse.error(ResponseCode.ERROR.getCode(), exception.getMessage());
    }

    /**
     * 处理校验参数对象异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public BaseResponse<?> validationExceptionHandler(MethodArgumentNotValidException e) {
        String message = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();
        log.error("参数异常：{}", message);
        return BaseResponse.error(ResponseCode.BAD_REQUEST.getCode(), message);
    }


    /**
     * 处理校验自定义的注解标注的异常
     */
    @ExceptionHandler(HandlerMethodValidationException.class)
    public BaseResponse<?> validationExceptionHandler(HandlerMethodValidationException e) {
        String message = e.getParameterValidationResults().get(0).getResolvableErrors().get(0).getDefaultMessage();
        log.error("参数异常：{}", message);
        return BaseResponse.error(ResponseCode.BAD_REQUEST.getCode(), message);
    }

}
